package day16.xianchengdemo.xianchengsafety;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Solve2
{
    public static double sum=10;
    public static void main(String[] args)
    {

//        if(sum==10)
//        {
//            System.out.println(Thread.currentThread().getName()+"取钱成功吐出了10元");
//            demo1.sum-=10;
//            System.out.println("主线程余额扣除成功"+sum);
//        }

        Account3 at=new Account3("at-01",10000);
        Thread t1=new MyThread3(at);
        t1.start();
        Thread t2=new MyThread3(at);
        t2.start();







    }




}

@Data
@NoArgsConstructor
@AllArgsConstructor
class Account3 //取钱，这个事情，是用户调了账户的取钱方法而已
{
    private String id;
    private  double money;
    private final Lock lk=new ReentrantLock();//定义一个锁的类型，final让锁不能被改，并且每个对象都有一个自己的锁，所以是个实例变量


    public void drawMoney(double money)
    { lk.lock();
         //try,finally,异常自己不处理他会默认往上抛，并且虚拟机崩了，谁让你不处理不去catch呢
        try {
            if(this.money>=money)
            {
                System.out.println(Thread.currentThread().getName()+"成功执行："+this.money+"成功吐出了"+money);
                this.money-=money;
                System.out.println(Thread.currentThread().getName()+"取出钱之后的余额为" + this.money);
                throw new RuntimeException("抛出异常");
            }
            else
            {
                System.out.println("余额不足");

            }
        } finally
        {
           lk.unlock();
        }
    }

}

class MyThread3 extends Thread
{
    private Account3 account;

    public MyThread3(Account3 account)//地址传递，这个account记录了at的地址，传递给成员变量了
    {
        this.account = account;
    }

    public void run()//线程体，（线程要干的活），必须是void返回,判断需不需要返回值，去考虑第几种方式
    {
//            if(demo1.sum==10)
//             {
//                                    //当前实例化对象（线程）的名字，不过好像静态方法比较常用，属于类的那种
//                 System.out.println(this.getName()+"取钱成功吐出了10元");
//                 demo1.sum-=10;
//                 System.out.println("子线程余额扣除成功"+demo1.sum);
        //
        account.drawMoney(10000);
    }

}
